5b8fd45751adefcd16567dffcbd1bb8ea7f77bdd
[nextcloud-desktop.git] /
1 //
2 //  FPUIExtensionCommunicationService.swift
3 //  FileProviderExt
4 //
5 //  Created by Claudio Cambra on 21/2/24.
6 //
7
8 import FileProvider
9 import Foundation
10 import NextcloudKit
11 import NextcloudFileProviderKit
12 import OSLog
13
14 class FPUIExtensionServiceSource: NSObject, NSFileProviderServiceSource, NSXPCListenerDelegate, FPUIExtensionService {
15     let listener = NSXPCListener.anonymous()
16     let serviceName = fpUiExtensionServiceName
17     let fpExtension: FileProviderExtension
18
19     init(fpExtension: FileProviderExtension) {
20         Logger.fpUiExtensionService.debug("Instantiating FPUIExtensionService service")
21         self.fpExtension = fpExtension
22         super.init()
23     }
24
25     func makeListenerEndpoint() throws -> NSXPCListenerEndpoint {
26         listener.delegate = self
27         listener.resume()
28         return listener.endpoint
29     }
30
31     func listener(
32         _ listener: NSXPCListener,
33         shouldAcceptNewConnection newConnection: NSXPCConnection
34     ) -> Bool {
35         newConnection.exportedInterface = NSXPCInterface(with: FPUIExtensionService.self)
36         newConnection.exportedObject = self
37         newConnection.resume()
38         return true
39     }
40
41     //MARK: - FPUIExtensionService protocol methods
42
43     func credentials() async -> NSDictionary {
44         return (fpExtension.ncAccount?.dictionary() ?? [:]) as NSDictionary
45     }
46
47     func itemServerPath(identifier: NSFileProviderItemIdentifier) async -> NSString? {
48         let rawIdentifier = identifier.rawValue
49         Logger.shares.info("Fetching shares for item \(rawIdentifier, privacy: .public)")
50
51         guard let baseUrl = fpExtension.ncAccount?.davFilesUrl else {
52             Logger.shares.error("Could not fetch shares as ncAccount on parent extension is nil")
53             return nil
54         }
55
56         let dbManager = FilesDatabaseManager.shared
57         guard let item = dbManager.itemMetadataFromFileProviderItemIdentifier(identifier) else {
58             Logger.shares.error("No item \(rawIdentifier, privacy: .public) in db, no shares.")
59             return nil
60         }
61
62         let completePath = item.serverUrl + "/" + item.fileName
63         return completePath.replacingOccurrences(of: baseUrl, with: "") as NSString
64     }
65 }